package cn.lg.soar.mvc.util;

import cn.lg.soar.common.algorithm.CryptoUtils;
import cn.lg.soar.common.data.msg.I18n;
import cn.lg.soar.common.exceptions.ParameterException;
import cn.lg.soar.common.util.IpUtil;
import eu.bitwalker.useragentutils.DeviceType;

import javax.servlet.http.HttpServletRequest;
import java.io.File;

/**
 * @author luguoxiang
 * @date 2022/5/30
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public interface RequestUtils {

    /**
     * 转换设备类型
     * @param type
     * @return
     */
    static DeviceType toDeviceType(Integer type) {
        if (type == null) {
            return null;
        }
        switch (type) {
            case 0: return DeviceType.COMPUTER;
            case 1: return DeviceType.MOBILE;
            case 2: return DeviceType.TABLET;
            case 3: return DeviceType.GAME_CONSOLE;
            case 4: return DeviceType.DMR;
            case 5: return DeviceType.WEARABLE;
            case 6: return DeviceType.UNKNOWN;
            default: throw new ParameterException(106, I18n.build("设备类型不支持"));
        }
    }

    /**
     * 客户端id（生成客户端识别号）
     * 注意这里需要通过客户端 ip 和 User-Agent 生成，需保证请求时正确带回相关信息，如网关和nginx转发时注意
     * @param request
     * @return
     */
    static String clientId(HttpServletRequest request) {
        String header = request.getHeader("User-Agent");
        String remoteIp = IpUtil.getRemoteIp(request);
        return CryptoUtils.hmac256Str(remoteIp.getBytes(), header.getBytes());
    }

    /**
     * 客户端id（生成客户端识别号）
     * @return
     */
    static String clientId() {
        return clientId(ServletUtils.getRequest());
    }

    /**
     * 获取当前请求
     * @return
     */
    static HttpServletRequest getCurrent() {
        return ServletUtils.getRequest();
    }

    /**
     * 获取请求头信息
     * @param name
     * @return
     */
    static String getHeader(String name) {
        return ServletUtils.getHeader(name);
    }

    /**
     * 获取请求参数
     * @param name
     * @return
     */
    static String getParameter(String name) {
        return ServletUtils.getParameter(name);
    }

    /**
     * 获取请求头或请求参数
     * @param name
     * @return
     */
    static String getHeaderOrParameter(String name) {
        return ServletUtils.getHeaderOrParameter(name);
    }

    static String getMimeType(File file) {
        return getCurrent().getServletContext().getMimeType(file.getName());
    }

    static String getMimeType(String filename) {
        /* 通过以下方式扩展
        @Configuration
        public class MimeMappingConfig implements WebServerFactoryCustomizer<ConfigurableServletWebServerFactory> {
            @Override
            public void customize(ConfigurableServletWebServerFactory factory) {
                MimeMappings mappings = new MimeMappings(MimeMappings.DEFAULT);
                mappings.add("xxx", "application/xml; charset=utf-8");
                factory.setMimeMappings(mappings);
            }
        }
        */
        return getCurrent().getServletContext().getMimeType(filename);
    }


}
